package main

import "fmt"

/*
*
考察点：
1. 切片底层数组引用
2. 引用的数组 len 和 cap
3. 切片扩容：
  - 何时扩容
  - 扩容规则
*/
func main() {
	a := []int{1, 2, 3, 4}
	x := a[:1] //1,len=1,cap=4
	y := a[2:] //{3,4},len=2,cap=2
	fmt.Println("x: ", x, len(x), cap(x), "y: ", y, len(y), cap(y))
	//append到x上，修改到了底层引用的数组a[1],a[2],因此y值也改变
	x = append(x, y...) //x {1,3,4} a {1,3,4,4} y {4,4}
	fmt.Println("x-append1: ", x, len(x), cap(x), "y: ", y, len(y), cap(y), "a: ", a)
	// append到x上，超出当前x容量4，翻倍扩容
	x = append(x, y...) //x {1,3,4,4,4} a{1,3,4,4}
	fmt.Println("x-append2: ", x, len(x), cap(x), "y: ", y, len(y), cap(y), "a: ", a)
	// 因为x发生扩容后和a引用的不是同一个数组，所以改动仅对x生效
	x[3] = 0 //x {1 3 4 0 4} a{1 3 4 4 }
	fmt.Println("x: ", x)
	fmt.Println("a: ", a)
}
